#ifndef ELEMENT_DOM_H
#define ELEMENTDOM_H

#include <map>
#include <vector>
#include <string>
#include <iostream>

#include "debugstreams.h"

using namespace std;

/**
 * Classe qui permet de gérer les différentes balises d'un fichier
 * XML. Un ElementDOM stocke le nom de la balise, la valeur du champ
 * (si applicable) et les éventuels attributs et leur valeur.
 *
 * Chaque ElementDOM possède en plus un numéro (permet de reconstruire
 * la structure du fhichier source) et un parent (qui est le numéro de
 * l'ElementDO parent). Le "niveau " de l'élément est également stocké
 * (dans l'arbre DOM du fichier).
 *
 * La classe possède un niveau de sortie interne, que l'on peut régler
 * par la ligne ElementDOM::interne du fichier CONFIG.
 *
 * @author Johan "Solo" Luisier
 */
class ElementDOM
{
 public:
  ElementDOM(const string& bal = "", const unsigned int& niv = 0,
	     const string& data = "", const unsigned int& numero = 0,
	     const int& parent = 0, const bool& aDonnees = false );
  ElementDOM(const ElementDOM& dom);
  virtual ~ElementDOM();
  void setBalise(const string& bal);
  void setNiveau(const unsigned int& niv);
  void setDonnees(const string& data );
  void setNumero(const unsigned int& numero);
  void setParent(const int& parent);
  void setADonnees(const bool& aDonnees);
  void ajoutAttribut(const string& attrib, const string& val);
  const string& balise() const;
  const unsigned int& niveau() const;
  const string& donnees() const;
  const unsigned int& numero() const;
  const int& parent() const;
  const bool& aDonnees() const;
  bool aAttributs() const;
  vector< string > attributs() const;
  const string& attribut(const string& attrib) const;
  const string& attribut(const unsigned int& num) const;
  ElementDOM& operator=(const ElementDOM& dom);
  ostream& afficheAttributs(ostream& os) const;
  static void setLevel(const DebugLevelType& lvl);
 protected:
  /**
   * Nom de la balise, le "tag".
   */
  string Balise;
  /**
   * Niveau hiérarchique de la balise, le document a le niveau 0, et
   * on incrémente en fonction du nombre de parent.
   */
  unsigned int Niveau;
  /**
   * Champ de données de la balise, sous forme de string quel que soit
   * le type réel.
   */
  string Donnees;
  /**
   * Numéro de la balise, permet de réécrire le fichier.
   */
  unsigned int Numero;
  /**
   * Numéro de la balise parente.
   */
  int Parent;
  /**
   * Booléen permettant de savoir si la balise contient des données ou
   * juste des enfants.
   */
  bool contientDonnees;
  /**
   * Permet de gérer les différents attributs que peut avoir la
   * balise, pour chaque attribut, on a ici une paire nom => valeur.
   */
  map< string, string > Attributs;
 private:
  /**
   * Chaîne de caractère vide, utilisée pour le retour d'une chaîne
   * vide.
   */
  static const string null;
  /**
   * Nombre d'attributs.
   */
  unsigned int nbrAttributs;
  /**
   * Niveau de sortie des méthodes de ElementDOM.
   */
  static DebugLevelType interne;
};

#endif // ELEMENTDOM_H
